/**
 * @file get_input.h
 * @brief 输入获取功能的头文件
 * @details 该头文件定义了一系列用于获取用户输入的函数声明，包括公历日期、农历日期、年份、月份、天数等输入的获取函数。
 */

#ifndef __GET_INPUT_H__
#define __GET_INPUT_H__

#include "..\..\include\calendar\calendar.h"
#include "..\..\include\calendar\calendar_table.h"

/**
 * @brief 获取有效的公历日期
 * @param gre_date 输出的公历日期结构体指针，用于存储获取到的日期信息
 * @details 函数提示用户输入公历日期（格式：年 月 日），验证输入的年份、月份、日期是否在有效范围内（1840-2100年，1-12月，1-31日），并检查日期是否超过当月天数。若输入错误，提示重新输入，直至输入正确为止。
 */
void GetGreDate(GREDATE* gre_date);

/**
 * @brief 获取有效的公历年月
 * @param pyear 输出的年份指针
 * @param pmonth 输出的月份指针
 * @details 函数提示用户输入公历年月（格式：年 月），验证年份是否在1840-2100范围内，月份是否在1-12范围内。若输入错误，提示重新输入，直至输入正确为止。
 */
void GetYearAndMonth(int *pyear, int* pmonth);

/**
 * @brief 获取有效的公历年份
 * @param pyear 输出的年份指针
 * @details 函数提示用户输入公历年份，验证年份是否在1840-2100范围内。若输入错误，提示重新输入，直至输入正确为止。
 */
void GetYear(int* pyear);

/**
 * @brief 获取有效的公历月份
 * @param pmonth 输出的月份指针
 * @details 函数提示用户输入公历月份，验证月份是否在1-12范围内。以2025年为基准年份进行验证。若输入错误，提示重新输入，直至输入正确为止。
 */
void GetMonth(int *pmonth);

/**
 * @brief 获取相对于基准日的有效天数差
 * @param base_days 基准日的天数（JDN）
 * @param pdays 输出的天数差指针
 * @details 函数提示用户输入天数差，验证输入的天数是否小于等于从1840年1月1日到基准日的最大天数差。若输入错误，提示重新输入，直至输入正确为止。
 */
void GetDifDays(int base_days, int* pdays);

/**
 * @brief 获取当前系统公历日期
 * @param gre_date 输出的公历日期结构体指针，用于存储当前日期信息
 * @details 函数通过调用系统时间接口获取当前日期，填充到输入的公历日期结构体中，并计算对应的基准日（JDN）。
 */
void GetCurDate(GREDATE* gre_date);

/**
 * @brief 获取有效的农历日期
 * @param lunar_date 输出的农历日期结构体指针，用于存储获取到的日期信息
 * @details 函数提示用户输入农历日期（格式：年 月 日，闰月需后续确认），首先验证年份是否在1840-2100范围内。然后检查是否为闰月，根据农历码表判断输入月份是否为闰月，并提示用户确认。最后验证输入的日期是否超过当月天数（大月30天，小月29天）。若输入错误，提示重新输入，直至输入正确为止。
 */
void GetLunDate(LUNARDATE *lunar_date);

#endif